package com.example.demo.controller;


import com.example.demo.StudentComponent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.PostConstruct;


@RequestMapping("/test")  // 等同于 servlet 时的 @Webservlet("/xxx")
@Controller
@ResponseBody  // 加载类上，表示当前类中的所有方法返回的都是非静态页面的数据
               // 不加这个注解，表示返回的 hello world 是一个静态页面的标题，会在static下会找这个静态页面，没找到就会报错
public class TestController {

    // 1.得到日志对象，作用范围：类，写到类里面
    // 打印日志的时候需要打印出在哪个类，所以是private
    // 设置成静态的更好调用，直接就调用，类名. 的方式
    // 这个对象不期望被改变，所以是 final
    // 注意不要导错包 slf4j的包   getLogger() 推荐使用第二种方式
    private static final Logger log = LoggerFactory.getLogger(TestController.class);

    // 读取 application.properties 文件中的用户自定义内容

    // 这里获取的注解都是由固定格式的 ， 不然不会获取到理想的数据
    //@Value("javaclass") // 和@Autowired注解，属性注入有点像，还有@Resource
    @Value("${myConfig.number}")  // 注意一定是 ${key} 的格式
    // 这里可以时public 看是不是只在本类中使用中使用
    private int myConfig;

    @Value("${mystr1}")
    private String mystr1;

    @Value("${mystr2}")
    private String mystr2;

    @Value("${mystr3}")
    private String mystr3;

    @Autowired  // 属性注入
    private StudentComponent studentComponent;

    // @Value 注解只能获取到 student对象中的一个属性，加入有100个属性，不可能写入100个value注解
    // 需要用到 @ConfigurationProperties注解
    @Value("${student.age}")
    private int age;

    @PostConstruct  // 初始化方法，类初始化的时候就会执行这个方法
    public void doPostConstruct() {
        System.out.println("-----------------------");
        System.out.println(mystr1);  // 你\n好
        System.out.println(mystr2);  // 你\n好
        System.out.println(mystr3);  // 你
                                     // 好
        System.out.println("-----------------------");
        System.out.println("age -> " + age);
        System.out.println(studentComponent);
    }

    @RequestMapping("/sayHi") // 等同于 servlet 时的 @Webservlet("/xxx")
                              // 在这里相当于是二级目录 localhost:8080/test/sayHi
    // 在浏览器上返回 hello world 信息
    public String sayHi() {
//         问题： 不会持久化保存
        System.out.println("打印日志");

        // 目的就是打印日志，方法名不同是为了区分级别
        log.trace("i'm trace"); // 执行轨迹
        log.debug("i'm debug"); // 执行debug模式时，打印这个日志
        log.info("i'm info");  // 普通信息
        log.warn("i'm warn"); // 发生警告时，打印这个日志
        log.error("i'm error"); // 发生错误时，打印这个日志
        return "hello world -> " + myConfig;
    }
}
